package framework;

import org.openqa.selenium.By;
import framework.elements.Label;
import framework.forms.MainForm;
//import framework.forms.UploadXmlPage;
import framework.interfaces.DataTableInterface.DataTables;

/**
 * Абстрактный класс, описывающий базовую форму (страницу) приложения
 */
abstract public class BaseForm extends BaseEntity {

	protected By		titleLocator;	// локатор элемента, по которому определяется открытие формы
	protected String	title;			// заголовок формы, например, "Логин"
	protected String	name;			// полное имя формы, которое выводится в лог, например, "Форма 'Логин'"
	private final String messageTrue = " содержит корректное значение:";
	private final String messageFalse =" содержит некорректное значение.";
	private static final Label versionLbl = new Label(By.xpath("//div[@id='footer']/div[@class='version']"), "Версия приложения");
	private static String APP_VERSION = "";
	private static String generalLabelRow = "//tr[contains(.,'%1$s')]/td[2][.='%2$s']";

	/** Возвращает текст " содержит корректное значение:"
	 * @return " содержит корректное значение:"
	 */
	public String getMessageTruePart(){
		return messageTrue;
	}

	/** Возвращает текст " содержит некорректное значение."
	 * @return " содержит некорректное значение."
	 */
	public String getMessageFalsePart(){
		return messageFalse;
	}

	/**
	 * Основной конструктор
	 * @param titleLocator Локатор заголовка формы
	 * @param title Имя формы
	 */
	protected BaseForm(final By titleLocator, final String title) {
		init(titleLocator, title);
		assertIsOpen();
	}

	/** Формотирование логов
	 *@param message message
	 * @return вывод отформатированных логов
	 */
	protected String formatLogMsg(String message) {
		return message;
	}

	/**
	 * Инициализация полей класса значениями, переданными в конструктор
	 */
	private void init(final By titleLocator, final String title) {
		this.titleLocator = titleLocator;
		this.title = title;
		this.name = String.format("Form '%1$s'", this.title);
	}

	/**
	 * Проверка открытия формы Если форма не открыта, тест прекращает свою работу
	 */
	public void assertIsOpen() {
		Label elem = new Label(titleLocator, title);
		try {
			elem.waitAndAssertIsPresent();
			info(String.format("Форма '%1$s' появилась", this.title));
		} catch (Throwable e) {
			fatal(String.format("Форма '%1$s' не появилась", this.title));
		}
	}


	/**
	 * Проверить значение по лейблу справа
	 * @param label label
	 * @param expectedValue expectedValue
	 */
	protected final void checkValueByLabel(String label, String expectedValue) {
		new Label(By.xpath(String.format(generalLabelRow, label, expectedValue)),label).assertIsPresent();
	}


	/** Возвращает версию стенда
	 * @return версия стенда
	 */
	public static String getVersion(){
		browser.waitForPageToLoad();
		if(APP_VERSION.equals("")){
			APP_VERSION = versionLbl.getText().replace("Версия системы ", "");
		}
		logger.info("Версия системы: " + APP_VERSION);
		return APP_VERSION;
	}

/*	*//** Открывает форму загрузки xml файлов
	 * @return форма загрузки xml файлов
	 *//*
	public static UploadXmlPage navigateToUploadPage(){
		browser.getDriver().navigate().to(props.getProperty("urlUploadXmlPage").replace("hostname", System.getProperty("hostname")));
		browser.waitForPageToLoad();
		return new UploadXmlPage();
	}*/

	/** Открывает главную страницу
	 * @return главная страница
	 */
	public static MainForm navigateToMainPage(){
		browser.getDriver().navigate().to(props.getProperty("urlLoginPage").replace("hostname", System.getProperty("hostname")));
		browser.waitForPageToLoad();
		return new MainForm();
	}

	public int getTableIndex(DataTables table) {
		// TODO Auto-generated method stub
		return 0;
	}
}
